/**
 * 螺旋矩阵
 * 按照顺时针螺旋顺序，返回矩阵中的所有元素
 * 
 * 算法思路：
 * 使用四个边界变量（top, bottom, left, right）来定义当前需要遍历的边界
 * 按照 上边界 -> 右边界 -> 下边界 -> 左边界 的顺序依次遍历
 * 每遍历完一条边后，收缩对应的边界，直到所有元素都被遍历
 * 
 * @param matrix 二维矩阵
 * @returns 按螺旋顺序排列的一维数组
 */
function spiralOrder(matrix: number[][]): number[] {
    // 边界情况：空矩阵直接返回空数组
    if (matrix.length === 0) return [];

    const result: number[] = [];
    // 定义四个边界：上、下、左、右
    let top = 0;
    let bottom = matrix.length - 1;
    let left = 0;
    let right = matrix[0].length - 1;

    // 当上下边界和左右边界都有效时，继续遍历
    while (top <= bottom && left <= right) {
        // 第一步：从左到右遍历上边界
        for (let i = left; i <= right; i++) {
            result.push(matrix[top][i]);
        }
        top++; // 上边界下移

        // 第二步：从上到下遍历右边界
        for (let i = top; i <= bottom; i++) {
            result.push(matrix[i][right]);
        }
        right--; // 右边界左移

        // 检查是否还有行需要处理（避免重复遍历）
        if (top <= bottom) {
            // 第三步：从右到左遍历下边界
            for (let i = right; i >= left; i--) {
                result.push(matrix[bottom][i]);
            }
            bottom--; // 下边界上移
        }

        // 检查是否还有列需要处理（避免重复遍历）
        if (left <= right) {
            // 第四步：从下到上遍历左边界
            for (let i = bottom; i >= top; i--) {
                result.push(matrix[i][left]);
            }
            left++; // 左边界右移
        }
    }

    return result;
}